#!/usr/bin/env python
"""
强制初始化脚本：创建默认超级管理员账号

功能：
1. 强制创建默认的超级管理员角色和用户
2. 即使数据库中已有数据，也会创建admin账号
3. 创建用户名为admin，密码为admin123的超级管理员账号
4. 该账号拥有所有路由页面的操作权限

使用方法：
python initialize_admin_force.py
"""

import os
import sys
import django
from django.contrib.auth.hashers import make_password
from datetime import datetime

# 设置Django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Al_Compny_backend.settings')
django.setup()

from user.models import SysUser
from role.models import Role, UserRole


def check_existing_data():
    """
    检查现有数据
    """
    user_count = SysUser.objects.count()
    role_count = Role.objects.count()
    
    print(f"当前数据库状态：")
    print(f"  用户数量: {user_count}")
    print(f"  角色数量: {role_count}")
    
    return user_count, role_count


def create_or_get_super_admin_role():
    """
    创建或获取超级管理员角色
    """
    try:
        # 检查是否已存在超级管理员角色
        super_role = Role.objects.filter(key='super_role').first()
        if super_role:
            print(f"超级管理员角色已存在: {super_role.name}")
            return super_role
        
        # 创建超级管理员角色
        super_role = Role.objects.create(
            name='超级管理员',
            key='super_role',
            status=0,  # 0表示正常
            remark='超级管理员，拥有所有权限',
            create_time=datetime.now(),
            update_time=datetime.now()
        )
        print(f"成功创建超级管理员角色: {super_role.name}")
        return super_role
        
    except Exception as e:
        print(f"创建超级管理员角色失败: {e}")
        return None


def create_or_get_admin_user():
    """
    创建或获取admin用户
    """
    try:
        # 检查是否已存在admin用户
        admin_user = SysUser.objects.filter(username='admin').first()
        if admin_user:
            print(f"admin用户已存在: {admin_user.username}")
            # 更新密码为默认密码
            admin_user.password = make_password('admin123')
            admin_user.save()
            print(f"已重置admin用户密码为默认密码")
            return admin_user
        
        # 创建admin用户
        admin_user = SysUser.objects.create(
            username='admin',
            password=make_password('admin123'),  # 加密密码
            nickname='超级管理员',
            email='admin@example.com',
            gender='other',
            status=0,  # 0表示正常
            create_time=datetime.now().date(),
            update_time=datetime.now().date(),
            remark='系统默认超级管理员账号'
        )
        print(f"成功创建admin用户: {admin_user.username}")
        return admin_user
        
    except Exception as e:
        print(f"创建admin用户失败: {e}")
        return None


def assign_role_to_user(user, role):
    """
    为用户分配角色
    """
    try:
        # 检查是否已存在用户角色关联
        user_role = UserRole.objects.filter(user=user, role=role).first()
        if user_role:
            print(f"用户 {user.username} 已拥有角色 {role.name}")
            return user_role
        
        # 创建用户角色关联
        user_role = UserRole.objects.create(
            user=user,
            role=role,
            create_time=datetime.now()
        )
        print(f"成功为用户 {user.username} 分配角色 {role.name}")
        return user_role
        
    except Exception as e:
        print(f"为用户分配角色失败: {e}")
        return None


def force_initialize_admin_account():
    """
    强制初始化超级管理员账号
    """
    print("=" * 50)
    print("开始强制初始化超级管理员账号...")
    print("=" * 50)
    
    # 检查现有数据
    user_count, role_count = check_existing_data()
    
    if user_count > 0 or role_count > 0:
        print("检测到数据库中已有数据，将强制创建admin账号...")
    
    # 创建或获取超级管理员角色
    super_role = create_or_get_super_admin_role()
    if not super_role:
        print("创建超级管理员角色失败，初始化终止")
        return False
    
    # 创建或获取admin用户
    admin_user = create_or_get_admin_user()
    if not admin_user:
        print("创建admin用户失败，初始化终止")
        return False
    
    # 为用户分配角色
    user_role = assign_role_to_user(admin_user, super_role)
    if not user_role:
        print("为用户分配角色失败，初始化终止")
        return False
    
    print("=" * 50)
    print("强制初始化完成！")
    print("=" * 50)
    print("默认超级管理员账号信息：")
    print(f"  用户名: admin")
    print(f"  密码: admin123")
    print(f"  角色: 超级管理员")
    print(f"  权限: 可以操作所有路由页面")
    print("=" * 50)
    
    return True


def main():
    """
    主函数
    """
    try:
        success = force_initialize_admin_account()
        if success:
            print("强制初始化脚本执行成功！")
            sys.exit(0)
        else:
            print("强制初始化脚本执行失败！")
            sys.exit(1)
    except Exception as e:
        print(f"强制初始化脚本执行出错: {e}")
        sys.exit(1)


if __name__ == '__main__':
    main() 